I2C是设备之间的两线通信协议。在物理层它只需要两个信号线:SCL 和 SDA,分别是时钟和数据线。I2C 对象关联到总线,它可以在创建时初始化,也可以稍后初始化。

class machine.I2C(scl, sda, freq)

scl:i2c设备时钟引脚对象
    Pin(0)、Pin(2)、Pin(4)、Pin(5)、Pin(9)、Pin(16~19)、Pin(21~23)、Pin(25~27)    
sda:i2c设备数据线引脚对象
    Pin(0)、Pin(2)、Pin(4)、Pin(5)、Pin(9)、Pin(16~19)、Pin(21~23)、Pin(25~27)
freq:SCL时钟频率
    0 < freq ≤ 500000(Hz)

定义I2C

示例:

from machine import I2C, Pin

i2c = I2C(scl=Pin(22), sda=Pin(21), freq=10000)

类函数

1. I2C.init(scl, sda, freq)

函数说明:初始化i2c总线。

scl:SCL信号线的I/O口
sda:SDA信号线的I/O口
freq:SCL时钟频率

示例:

i2c.init(scl=Pin(22),sda=Pin(21))

2. I2C.scan()

函数说明:扫描0x08到0x77之间的I2C地址,并返回设备列表。
示例:

i2c.scan()

3. I2C.start()

函数说明:在总线上触发START状态(SCL为高电平时,SDA转为低电平)。
示例:

i2c.start()

4. I2C.stop()

函数说明:在总线上触发STOP状态 (SCL为高电平时,SDA转为高电平)。
示例:

i2c.stop()

5. I2C.write(buf)

函数说明:buf中的数据写入到总线,并返回写入的字节数。

buf:存储数据的缓冲区

注意
   使用write()函数时要与start函数一起使用,否则无法返回写入的字节数。
示例:

buf = b'123'
i2c.start()
i2c.write(buf)

6. I2C.readinto(buf, nack=True)

函数说明:从总线上读取数据并存放到buf,无返回值。

buf:存储数据的缓冲区

注意:
   读取的字节数是buf的长度。在接收到最后一个字节之前,总线将发送ACK信号。在接收到最后一个字节后,如果nack为True,那么将发送一个NACK信号,否则将发送一个ACK信号。 示例:

buf=bytearray(3)
i2c.readinto(buf)

其他类函数

标准总线操作

   下面函数是标准的I2C主模式读写操作。

1. I2C.readfrom(addr, nbytes)

函数说明:从指定地址设备读取数据,返回读取对象,这个对象与I2C设备有关。

addr:i2c设备地址(可由scan函数读取出来)
nbytes:要读取数据的大小

示例:

>>> print(i2c.scan())
[24]
>>> data = i2c.readfrom(24, 8)
>>> print(data)
b'\x00\x02\x00\x00\xe8\x03\xe8\x03'

2. I2C.readfrom_into(addr, buf)

函数说明:从指定地址设备读取buf.len()个数据到buf。

addr:i2c设备地址(可由scan函数读取出来)
buf:存储数据的缓冲区

示例:

>>> buf = bytearray(8)
>>> i2c.readfrom_into(24, buf)
>>> print(buf)
bytearray(b'\x00\x02\x00\x00\xe8\x03\xe8\x03')

3. I2C.writeto(addr, buf)

函数说明:将buf中的数据写入设备,并返回写入数据的大小。

addr:i2c设备地址(可由scan函数读取出来)
buf:存储数据的缓冲区

示例:

>>> b = bytearray(3)
>>> b[0] = 24
>>> b[1] = 111
>>> b[2] = 107
>>> i = i2c.writeto(24,b)
3

内存操作

   某些 I2C 设备作为存储设备 (或一组寄存器) ,可以读取或者写入。这种情况下,有两个地址和 I2C 事务相关: 从设备地址和内存地址。下面方法用于和这些设备进行通信。

1. I2C.readfrom_mem(addr, memaddr, nbytes, addrsize=8)

函数说明:从I2C设备的寄存器中读取并返回数据。

addr:i2c设备地址(可由scan函数读取出来)
memaddr:寄存器地址
nbytes:要读取的字节大小
addrsize:指定地址大小,默认为8位(在ESP8266上这个参数无效,地址大小总是8位)

示例:

b = i2c. readfrom_mem(24,  0x58, 3)
print(b)

运行结果:

b'\x00\x02\x01'

2. I2C.readfrom_mem_into(addr, memaddr, buf, addrsize=8)

函数说明:从I2C设备的寄存器中读取buf.len()个数据到buf,无返回值。

addr:i2c设备地址(可由scan函数读取出来)
memaddr:寄存器地址
buf:存储数据的缓冲区
addrsize:指定地址大小,默认为8位(在ESP8266上这个参数无效,地址大小总是8位),读取数据数量是buf的长度。

示例:

buf=bytearray(8)
i2c.readfrom_mem_into(24, 0x58, buf)

3. I2C.writeto_mem(addr, memaddr, buf, addrsize=8)

函数说明: 将buf 中的数据全部写入到从设备 addr 的内存 memaddr。

addr:i2c设备地址(可由scan函数读取出来)
memaddr:寄存器地址
buf:存储数据的缓冲区
addrsize:指定地址大小,默认为8位(在ESP8266上这个参数无效,地址大小总是8位),读取数据数量是buf的长度。

示例:

buf = b'123'
i2c.writeto_mem(24, 0x58, buf)

综合示例

from machine import I2C, Pin

i2c0 = I2C(scl=Pin(22), sda=Pin(21), freq=100000)

addr0 = i2c0.scan() #扫描I2C地址,以列表的形式返回设备地址
addr0 = addr0[0] #列表转换成int
print("address:", hex(addr0)) #打印I2C设备地址

buf1 = bytearray(5)
buf1 = i2c0.readfrom(addr0, 5) #从I2C设备地址addr0读取5个字节
print("readfrom():", buf1) #打印缓冲区内容

运行结果:

address: 0x18
readfrom(): b'\x00\x02\x00\x00\xe8'

results matching ""

    No results matching ""